widget: Always set out value
authorBenjamin Otte <otte@redhat.com>
Wed, 20 Feb 2019 03:07:34 +0000 (04:07 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 20 Feb 2019 03:07:34 +0000 (04:07 +0100)
Don't leave memory in an unitinialized case when returning FALSE from
gtk_widget_compute_transform().

We both know that people are going to call that function without
checking the return value.

gtk/gtkwidget.c

index c3395494ad960620fb20bb28b5c26e5e4afda972..21a1ff3333c9cdf483f3b06b0a8cc23f3583f9b5 100644 (file)
@@ -11245,7 +11245,8 @@ gtk_widget_pick (GtkWidget *widget,
  *
  * Returns: %TRUE if the transform could be computed, %FALSE otherwise.
  *   The transform can not be computed in certain cases, for example when
- *   @widget and @target do not share a common ancestor.
+ *   @widget and @target do not share a common ancestor. In that
+ *   case @out_transform gets set to the identity matrix.
  */
 gboolean
 gtk_widget_compute_transform (GtkWidget         *widget,
@@ -11268,7 +11269,10 @@ gtk_widget_compute_transform (GtkWidget         *widget,
 
   ancestor = gtk_widget_common_ancestor (widget, target);
   if (ancestor == NULL)
-    return FALSE;
+    {
+      graphene_matrix_init_identity (out_transform);
+      return FALSE;
+    }
 
   graphene_matrix_init_identity (&transform);
   for (iter = widget; iter != ancestor; iter = iter->priv->parent)
@@ -11293,7 +11297,10 @@ gtk_widget_compute_transform (GtkWidget         *widget,
       graphene_matrix_multiply (&inverse, &priv->transform, &inverse);
     }
   if (!graphene_matrix_inverse (&inverse, &inverse))
-    return FALSE;
+    {
+      graphene_matrix_init_identity (out_transform);
+      return FALSE;
+    }
 
   graphene_matrix_multiply (&transform, &inverse, out_transform);